1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 import java.awt.*;
34 import java.awt.event.InputEvent;
35 import java.awt.geom.*;
36
37
38 public class ShapeNotSetSometimes {
39
40 private Frame backgroundFrame;
41 private Frame window;
42 private static final Color BACKGROUND_COLOR = Color.BLUE;
43 private Shape shape;
44 private int[][] pointsToCheck;
45
46 private static Robot robot;
47
48 public ShapeNotSetSometimes() throws Exception {
49 EventQueue.invokeAndWait(new Runnable() {
50 public void run() {
51 initializeGUI();
52 }
53 });
54 }
55
56 private void initializeGUI() {
57 backgroundFrame = new BackgroundFrame();
58 backgroundFrame.setUndecorated(true);
59 backgroundFrame.setSize(300, 300);
60 backgroundFrame.setLocation(20, 400);
61 backgroundFrame.setVisible(true);
62
63 shape = null;
64 String shape_name = null;
65 Area a;
66 GeneralPath gp;
67 shape_name = "Rounded-corners";
68 a = new Area();
69 a.add(new Area(new Rectangle2D.Float(50, 0, 100, 150)));
70 a.add(new Area(new Rectangle2D.Float(0, 50, 200, 50)));
71 a.add(new Area(new Ellipse2D.Float(0, 0, 100, 100)));
72 a.add(new Area(new Ellipse2D.Float(0, 50, 100, 100)));
73 a.add(new Area(new Ellipse2D.Float(100, 0, 100, 100)));
74 a.add(new Area(new Ellipse2D.Float(100, 50, 100, 100)));
75 shape = a;
76 pointsToCheck = new int[][] {
77
78 {106, 86}, {96, 38}, {76, 107}, {180, 25}, {24, 105},
79 {196, 77}, {165, 50}, {14, 113}, {89, 132}, {167, 117},
80
81 {165, 196}, {191, 163}, {146, 185}, {61, 170}, {148, 171},
82 {82, 172}, {186, 11}, {199, 141}, {13, 173}, {187, 3}
83 };
84
85 window = new TestFrame();
86 window.setUndecorated(true);
87 window.setSize(200, 200);
88 window.setLocation(70, 450);
89 window.setShape(shape);
90 window.setVisible(true);
91
92 System.out.println("Checking " + window.getClass().getSuperclass().getName() + " with " + shape_name + " shape (" + window.getShape() + ")...");
93 }
94
95 class BackgroundFrame extends Frame {
96
97 @Override
98 public void paint(Graphics g) {
99
100 g.setColor(BACKGROUND_COLOR);
101 g.fillRect(0, 0, 300, 300);
102
103 super.paint(g);
104 }
105 }
106
107 class TestFrame extends Frame {
108
109 @Override
110 public void paint(Graphics g) {
111
112 g.setColor(Color.WHITE);
113 g.fillRect(0, 0, 200, 200);
114
115 super.paint(g);
116 }
117 }
118
119 public static void main(String[] args) throws Exception {
120 robot = new Robot();
121
122 for(int i = 0; i < 100; i++) {
123 System.out.println("Attempt " + i);
124 new ShapeNotSetSometimes().doTest();
125 }
126 }
127
128 private void doTest() throws Exception {
129 Point wls = backgroundFrame.getLocationOnScreen();
130
131 robot.mouseMove(wls.x + 5, wls.y + 5);
132 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
133 robot.delay(10);
134 robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
135 robot.delay(500);
136
137 EventQueue.invokeAndWait(new Runnable() {
138 public void run() {
139 window.requestFocus();
140 }
141 });
142
143 robot.waitForIdle();
144 try {
145 Thread.sleep(300);
146 } catch (InterruptedException e) {
147
148 }
149
150
151 final int COUNT_TARGET = 10;
152
153
154 for(int i = COUNT_TARGET; i < COUNT_TARGET * 2; i++) {
155 int x = pointsToCheck[i][0];
156 int y = pointsToCheck[i][1];
157 boolean inside = i < COUNT_TARGET;
158 Color c = robot.getPixelColor(window.getX() + x, window.getY() + y);
159 System.out.println("checking " + x + ", " + y + ", color = " + c);
160 if (inside && BACKGROUND_COLOR.equals(c) || !inside && !BACKGROUND_COLOR.equals(c)) {
161 System.out.println("window.getX() = " + window.getX() + ", window.getY() = " + window.getY());
162 System.err.println("Checking for transparency failed: point: " +
163 (window.getX() + x) + ", " + (window.getY() + y) +
164 ", color = " + c + (inside ? " is of un" : " is not of ") +
165 "expected background color " + BACKGROUND_COLOR);
166 throw new RuntimeException("Test failed. The shape has not been applied.");
167 }
168 }
169
170 EventQueue.invokeAndWait(new Runnable() {
171 public void run() {
172 backgroundFrame.dispose();
173 window.dispose();
174 }
175 });
176 }
177 }